/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.core;

import com.entidades.Campanha;
import com.entidades.Pacote;
import com.entidades.dao.ParametrosDao;
import com.entidades.enumerandos.StatusPacoteEnum;
import java.util.Collections;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Ricardo
 */
@Stateless
public class GerenciadorFilaBean implements GerenciadorFilaLocal {

    @PersistenceContext
    EntityManager em;
    private ParametrosDao parametroDao = new ParametrosDao();

    //TODO checagem de campanha com mesmo dono cuidado.
    public void recuperaFila() {

        List<Campanha> listaCampanhas = em.createQuery("select distinct p.campanha from Pacote as p ").getResultList();
        Collections.shuffle(listaCampanhas);
        
        for (Campanha campanha : listaCampanhas) {

            Integer qtdPacotes= FilaPacote.getInstance().getSizeFila();

            String maxQtd = parametroDao.obtemParametro("MAX_QTD_PACOTES_CAMPANHA_FILA", em);
            Integer maxPacotesPermitidos = Integer.valueOf(maxQtd);

            

            System.out.println("@@@@@@@@@@@@@@@@@");
            System.out.println("@@@");
            System.out.println("@@@");
            System.out.println("@@@ qtdPacotes: " + qtdPacotes);
            System.out.println("@@@ maxPacotesPermitidos: " + maxPacotesPermitidos* listaCampanhas.size());
            System.out.println("@@@");
            System.out.println("@@@");
            System.out.println("@@@@@@@@@@@@@@@@@");
            if (qtdPacotes <= maxPacotesPermitidos * listaCampanhas.size()) {
                Query q = em.createQuery("select p from Pacote as p " +
                        " where (p.status=:s1 or " +
                        " p.status=:s2 ) and" +
                        " p.campanha=:c").setParameter("s1", StatusPacoteEnum.NOVO).setParameter("s2", StatusPacoteEnum.PENDENTE).setParameter("c", campanha).setMaxResults(maxPacotesPermitidos);




                List<Pacote> listaPacotes = q.getResultList();
                if (listaPacotes != null && listaPacotes.size() > 0) {
                    System.out.println("AGENDADOR >>> Pacotes encontrados para enviar");

                    for (Pacote pacote : listaPacotes) {
                        pacote.setStatus(StatusPacoteEnum.AGUARDANDO);
                        em.merge(pacote);
                        em.flush();
                        this.adicionar(pacote);
                    }

                }
            }
        }




    }

    public synchronized Pacote removePacoteParaEnvio() {
        return (Pacote) FilaPacote.getInstance().removePacoteParaEnvio();
    }

    public void adicionar(Pacote pacote) {
        /*campanha.setStatus(StatusCampanhaEnum.AGUARDANDO);
        em.merge(campanha);
        em.flush();*/
        FilaPacote.getInstance().adicionar(pacote);
    }

    public void limpaLista() {
        FilaPacote.getInstance().limpaLista();
    }

    public Integer size() {
        return FilaPacote.getInstance().size();
    }
}
